package com.hspedu.qqclient.service;

import com.hspedu.qqcommon.Message;
import com.hspedu.qqcommon.MessageType;
import com.hspedu.qqcommon.User;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;

/**
 * @Author Stringzhua
 * @Date 2024/4/10 21:07
 * description:该类完成用户登录验证用户注册等等功能
 */
public class UserClientService {

    private User user = new User();
    //可能在其他地方使用user信息,因此做成成员属性
    //因为Socket在其他地方也可能使用,因此做出属性
    private Socket socket;

    //根据userId和password到服务器验证该用户是否合法
    public boolean checkUser(String userId, String password) throws IOException, ClassNotFoundException {
        boolean b = false;
        //创建User对象
        user.setUserId(userId);
        user.setPassword(password);
        //连接到服务器,发送user对象
        Socket socket =
                new Socket(InetAddress.getByName("127.0.0.1"), 9999);
        //得到ObjectOutputStream对象
        ObjectOutputStream oos =
                new ObjectOutputStream(socket.getOutputStream());
        oos.writeObject(user);//发送user对象

        //读取从服务器回复的Message对象
        ObjectInputStream ois =
                new ObjectInputStream(socket.getInputStream());
        Message ms = (Message) ois.readObject();
        if (ms.getMessageType().equals(MessageType.MESSAGE_LOGIN_SUCCESS)) {//登录成功
            //创建一个和服务器端保持通讯的线程->创建一个类ClientConnectServerThread
            ClientConnectServerThread clientConnectServerThread = new ClientConnectServerThread(socket);
            //启动客户端的线程
            clientConnectServerThread.start();
            //这里为了客户端的扩展,将线程加入集合中管理
            ManageClientConnectServerThread.addClientConnectServerThread(userId, clientConnectServerThread);
            b = true;
        } else {
            //登录失败,就不能启动和服务器通信线程,关闭socket
            socket.close();
        }
        return b;
    }

    //向服务器端请求在线用户列表
    public void onlineFriendList() {
        //发送一个message,MESSAGE_GET_ONLINE_FRIEND
        Message message = new Message();
        message.setMessageType(MessageType.MESSAGE_GET_ONLINE_FRIEND);
        message.setSender(user.getUserId());
        //发送给服务器
        try {
            //先从管理线程的集合中通过userId得到线程对象
            ClientConnectServerThread clientConnectServerThread = ManageClientConnectServerThread.getClientConnectServerThread(user.getUserId());
            //通过当前线程,得到当前Socket对应的ObjectOutputStream对象
            Socket socket = clientConnectServerThread.getSocket();
            //应该得到当前线程的Socket对应的ObjectOutputStream对象
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject(message);//发送一个Message对象,向服务端要在线用户列表
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //编写方法,退出客户端,并给服务端发送一个退出系统的message对象
    public void logout() {
        Message message = new Message();
        message.setMessageType(MessageType.MESSAGE_CLIENT_EXIT);
        message.setSender(user.getUserId());//一定要指定我是哪个客户端id

        //发送message
        try {
//            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            ObjectOutputStream oos =
                    new ObjectOutputStream(ManageClientConnectServerThread.getClientConnectServerThread(user.getUserId()).getSocket().getOutputStream());
            oos.writeObject(message);
            System.out.println(user.getUserId() + "退出了系统");
            System.exit(0);//结束进程
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
